#include <logf.h>
#include <kernel.h>
#include <stdarg.h>
#include <mutex.h>

#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"

mutex_t mutex;

void init_logf()
{
    // 关闭中断
    outb(COM1_PORT + 1, 0x00);
    // 启用DLAB
    outb(COM1_PORT + 3, 0x80);
    // 设置波特率除数（115200 / 0x03）
    // 低8位
    outb(COM1_PORT + 0, 0x03);
    // 高8位
    outb(COM1_PORT + 1, 0x00);
    // 设置线路协议
    outb(COM1_PORT + 3, 0x03);
    // 
    outb(COM1_PORT + 2, 0xC7);
    outb(COM1_PORT + 4, 0x0F);

    init_mutex(&mutex);
}

void logf(const char * fmt, ...)
{
    char buffer[128];
    va_list args;
    kernel_memset(buffer, '\0', sizeof(buffer));
    va_start(args, fmt);
    kernel_vsprintf(buffer, fmt, args);
    va_end(args);

    mutex_lock(&mutex);
    const char *p = buffer;
    while (*p != 0)
    {
        while (inb(COM1_PORT + 5) & (1 << 6) == 0);
        outb(COM1_PORT, *p++);
    }
    outb(COM1_PORT, '\r');
    outb(COM1_PORT, '\n');
    mutex_unlock(&mutex);
}